import os, sys
base_dir=os.path.abspath(os.path.dirname(__file__));
rootPath=os.path.split(base_dir);
sys.path.append(base_dir);

from symbol.base_symbol import *


# 添加符号表类
class SymbolTable:
	def __init__(self):
		self._symbols = OrderedDict()  # 存储符号的有序字典
		self.__init_builtins()  # 初始化内置类型符号

	def __init_builtins(self):  # 添加初始化内置类型符号的方法
		self.define(BuiltinTypeSymbol('INTEGER'))  # 定义整数类型符号
		self.define(BuiltinTypeSymbol('FLOAT'))    # 定义浮点数类型符号
		self.define(BuiltinTypeSymbol('STRING'))   # 定义字符串类型符号
		self.define(BuiltinTypeSymbol('Boolean'))   # 定义布尔类型符号

	def __str__(self):
		# 返回符号列表信息
		return f'Symbols:{[value for value in self._symbols.values()]}'

	__repr__ = __str__

	# 添加定义符号的方法
	def define(self, symbol):
		print(f'定义：{symbol}')
		self._symbols[symbol.name] = symbol  # 符号添加到字典

	# 添加查询符号的方法
	def lookup(self, name):
		print(f'查询变量：{name}')
		return self._symbols.get(name)  # 返回符号对象

	# 添加存入符号的方法
	def insert(self, symbol):
		print(f'存入：{symbol}')
		self._symbols[symbol.name] = symbol  # 以符号名称为键存入符号

	def viewTree(self):
		lists=[];
		for index in self._symbols:
			lists.append(self._symbols[index].viewTree())
		return {
			'SymbolTable':lists
		}
